package com.yuanss.backenddemo.controller;

import com.yuanss.backenddemo.common.R;
import com.yuanss.backenddemo.entity.po.SysRole;
import com.yuanss.backenddemo.entity.vo.req.AddRoleReqVo;
import com.yuanss.backenddemo.entity.vo.req.QueryRoleReqVo;
import com.yuanss.backenddemo.entity.vo.rsp.QueryRoleDetailRsp;
import com.yuanss.backenddemo.service.RoleService;
import com.yuanss.backenddemo.utils.ShiroUtils;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * @author yuanss
 * @version 1.0
 * @description 系统权限api
 * @date 2024/6/9 08:33:48
 */
@RestController
@RequestMapping("/role")
public class RoleController {
    @Resource
    private RoleService roleService;

    /**
     * 查询所有权限
     * @param queryRoleReqVo   查询条件
     * @return  权限列表
     */
    @RequiresRoles("admin")
    @PostMapping("/queryAll")
    public R<List<SysRole>> queryAll(@RequestBody QueryRoleReqVo queryRoleReqVo) {
        return roleService.queryAll(queryRoleReqVo);
    }

    /**
     * 添加角色
     * @param sysRole  角色信息
     * @return  添加结果
     */
    @PostMapping
    public R addRole(@RequestBody AddRoleReqVo sysRole) {
        if(roleService.checkRoleNameUnique(sysRole)){
            return R.error("角色名称重复");
        }
        if(!roleService.checkRoleCodeUnique(sysRole)){
            return R.error("角色编码重复");
        }
        sysRole.setCreateBy(ShiroUtils.getUserId());
        sysRole.setCreateTime(new Date());
        return roleService.addRole(sysRole);
    }

    /**
     * 删除角色
     * @param roleId  角色id
     * @return  删除结果
     */
    @DeleteMapping("/{roleId}")
    public R deleteRole(@PathVariable Long roleId) {
        return roleService.deleteRole(roleId);
    }

    /**
     * 更新角色
     * @param sysRole  角色信息
     * @return  更新结果
     */
    @PutMapping
    public R updateRole(@RequestBody AddRoleReqVo sysRole) {
        if(roleService.checkRoleNameUnique(sysRole)){
            return R.error("角色名称重复");
        }
        if(!roleService.checkRoleCodeUnique(sysRole)){
            return R.error("角色编码重复");
        }
        sysRole.setUpdateBy(ShiroUtils.getUserId());
        sysRole.setUpdateTime(new Date());
        return roleService.updateRole(sysRole);
    }

    /**
     * 根据角色id查询角色详情
     * @param roleId  角色id
     * @return  角色详情
     */
    @GetMapping("/{roleId}")
    public R<QueryRoleDetailRsp> queryRole(@PathVariable Long roleId) {
        return roleService.queryRole(roleId);
    }

    /**
     * 改变角色状态
     * @param roleId    角色id
     * @return  改变结果
     */
    @PutMapping("/changeStatus/{roleId}")
    public R changeStatus(@PathVariable Long roleId){
        return roleService.changeStatus(roleId);
    }
}
